package fr.upmf.ic2a.sharedata.service;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.client.ClientProtocolException;
import org.w3c.dom.NodeList;

import fr.upmf.ic2a.sharedata.provider.ShareDataContract;
import android.app.Service;
import android.content.ContentValues;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.IBinder;
import android.preference.PreferenceManager;

public class Synchronisation extends Service {

        // declaration des variables
        Thread t = new Thread();
        boolean started = true;

        @Override
        public IBinder onBind(Intent intent) {
                // TODO Auto-generated method stub
                return null;
        }

        @Override
        public void onCreate() {

                super.onCreate();

                // on recupere les preferences
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

                //Delai de synchronisation enregistré dans les préférences
                String s = preferences.getString("delaiSynch", null);
                int synch=10;
               
                if (s != null) {
                        synch = Integer.parseInt(s);
                }

                //Tant qu'il n'est pas arrété, le service continue de tourner
                while (started) {
                        try {
                                sendShare();
                                receiveShare();
                                deleteShare();
                        } catch (ClientProtocolException e1) {
                                e1.printStackTrace();
                        } catch (IOException e1) {
                                e1.printStackTrace();
                        }
                       
                        //Delai d'attente entre deux synchronisations
                        try {
                                Thread.sleep(synch * 60000);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
        }

        @Override
        public void onDestroy() {
               
                super.onDestroy();
                try {
                        started = false;
                        t.join();
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
        }

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
                started = true;
                t.start();
                return super.onStartCommand(intent, flags, startId);

        }

        // Méthode qui envoie les nouveaux fichiers partagés sur le serveur
        public void sendShare() throws ClientProtocolException, IOException {
            // On recupere les preferences
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
           
            //Récupération des paramètres de la requêtes a envoyé au serveur
            String login = preferences.getString("login", "");
            String password = preferences.getString("password", "");
            String urlServer = preferences.getString("serveur", "");
           
            //Paramètres de la requete au content provider
            String[] projection = new String[] { ShareDataContract.Sent._ID, ShareDataContract.Sent.SYNC_STATUS};

            // Requête au content provider de recupération des partages envoyés
            Cursor cur = getBaseContext().getContentResolver().query(ShareDataContract.Sent.CONTENT_URI, projection, null, null, null);

            //On parcours les résultats
            if (cur.moveToFirst()) {
                    do {
                            //Si le statut du partage correspond à "to send" on demande le partage sur le serveur
                            if (cur.getString(cur.getColumnIndex(ShareDataContract.Sent.SYNC_STATUS)) == "1") {
                                   
                                    //Creation de la requete
                                    URL url = null;
                                    String id=cur.getString(cur.getColumnIndex(ShareDataContract.Sent._ID));
                                    String nom = cur.getString(cur.getColumnIndex(ShareDataContract.Sent.TITLE));
                                    String type =  cur.getString(cur.getColumnIndex(ShareDataContract.Sent.CONTENT_TYPE));
                                    
                                    
                                    String[] projection2 = new String[] { ShareDataContract.Sent.TITLE};
                                    Cursor cur2 = getBaseContext().getContentResolver().query(Uri.parse(ShareDataContract.Sent.CONTENT_URI+"/"+id+"/contacts"), projection2, null, null, null);

                                    ArrayList<String> destinataires = new ArrayList<String>();
                                    
                            		if (cur.moveToFirst()) {
                            			do {
                            				destinataires.add(cur2.getString(cur2.getColumnIndex(ShareDataContract.Sent.TITLE)));
                            				} while (cur.moveToNext());
                            		}
                                    
                                    
                                    try {
                                            url = new URL(urlServer+"/manageShare?login="+login+"&passwd="+password+"&id="+id+"&nom="+nom+"&type="+type+"&destinataire="+destinataires);
                                    } catch (MalformedURLException e1) {
                                            e1.printStackTrace();
                                    }
                                   
                                    //Envoie de la requête au serveur de suppression du partage
                                    try {

                                            //Paramètres de connexion
                                            HttpURLConnection cnx = (HttpURLConnection) url.openConnection();
                                            cnx.setDoOutput(false);
                                            cnx.setRequestMethod("DELETE");
                                            //Connexion
                                            cnx.connect();
                                            cnx.getInputStream().close();
                                           
                                            //Création des paramètres de mise à jour dans le content provider
                                            ContentValues updadeShare = new ContentValues();
                                            updadeShare.put(ShareDataContract.Sent._ID, cur.getString(cur.getColumnIndex(ShareDataContract.Sent._ID)));
                                            updadeShare.put(ShareDataContract.Sent.SYNC_STATUS, "SYNCH");
                                            //Mise a jour du champ synchonisation dans la base
                                            int result = getBaseContext().getContentResolver().update(ShareDataContract.Sent.CONTENT_URI, updadeShare , null , null);
                                            System.out.println(result);                    
                                           
                                    } catch (Exception e) {
                                            e.printStackTrace();
                                    }
                            }
                    } while (cur.moveToNext());
            }
        }

        // Methode qui envoie une requete de suppression de partages au serveur
        public void deleteShare() {
               
                // On recupere les preferences
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
               
                //Récupération des paramètres de la requêtes a envoyé au serveur
                String login = preferences.getString("login", "");
                String password = preferences.getString("password", "");
                String urlServer = preferences.getString("serveur", "");
               
                //Paramètres de la requete au content provider
                String[] projection = new String[] { ShareDataContract.Sent._ID, ShareDataContract.Sent.SYNC_STATUS };

                // Requête au content provider de recupération des partages envoyés
                Cursor cur = getBaseContext().getContentResolver().query(ShareDataContract.Sent.CONTENT_URI, projection, null, null, null);

                //On parcours les résultats
                if (cur.moveToFirst()) {
                        do {
                                //Si le statut du partage correspond à "to delete" on supprime le partage sur le serveur
                                if (cur.getString(cur.getColumnIndex(ShareDataContract.Sent.SYNC_STATUS)) == "2") {
                                       
                                        //Creation de la requete
                                        URL url = null;
                                        String id=cur.getString(cur.getColumnIndex(ShareDataContract.Sent._ID));
                                        try {
                                                url = new URL(urlServer+"/manageShare?login="+login+"&passwd="+password+"&id="+id);
                                        } catch (MalformedURLException e1) {
                                                e1.printStackTrace();
                                        }
                                       
                                        //Envoie de la requête au serveur de suppression du partage
                                        try {

                                                //Paramètres de connexion
                                                HttpURLConnection cnx = (HttpURLConnection) url.openConnection();
                                                cnx.setDoOutput(false);
                                                cnx.setRequestMethod("DELETE");
                                                //Connexion
                                                cnx.connect();
                                                cnx.getInputStream().close();
                                               
                                                //Création des paramètres de mise à jour dans le content provider
                                                ContentValues updadeShare = new ContentValues();
                                                updadeShare.put(ShareDataContract.Sent._ID, cur.getString(cur.getColumnIndex(ShareDataContract.Sent._ID)));
                                                updadeShare.put(ShareDataContract.Sent.SYNC_STATUS, "SYNCH");
                                                //Mise a jour du champ synchonisation dans la base
                                                int result = getBaseContext().getContentResolver().update(ShareDataContract.Sent.CONTENT_URI, updadeShare , null , null);
                                                System.out.println(result);                    
                                               
                                        } catch (Exception e) {
                                                e.printStackTrace();
                                        }
                                }
                        } while (cur.moveToNext());
                }
        }

        // Méthode qui récupére les nouveaux partages recu de l'utilisateur sur le serveur
        public void receiveShare() {
               
        }
}
